home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / rslib.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  3.0 KB  |  110 lines

  1. /*
  2.  * include/linux/rslib.h
  3.  *
  4.  * Overview:
  5.  *   Generic Reed Solomon encoder / decoder library
  6.  *
  7.  * Copyright (C) 2004 Thomas Gleixner (tglx@linutronix.de)
  8.  *
  9.  * RS code lifted from reed solomon library written by Phil Karn
  10.  * Copyright 2002 Phil Karn, KA9Q
  11.  *
  12.  * $Id: rslib.h,v 1.4 2005/11/07 11:14:52 gleixner Exp $
  13.  *
  14.  * This program is free software; you can redistribute it and/or modify
  15.  * it under the terms of the GNU General Public License version 2 as
  16.  * published by the Free Software Foundation.
  17.  */
  18.  
  19. #ifndef _RSLIB_H_
  20. #define _RSLIB_H_
  21.  
  22. #include <linux/list.h>
  23.  
  24. /**
  25.  * struct rs_control - rs control structure
  26.  *
  27.  * @mm:        Bits per symbol
  28.  * @nn:        Symbols per block (= (1<<mm)-1)
  29.  * @alpha_to:    log lookup table
  30.  * @index_of:    Antilog lookup table
  31.  * @genpoly:    Generator polynomial
  32.  * @nroots:    Number of generator roots = number of parity symbols
  33.  * @fcr:    First consecutive root, index form
  34.  * @prim:    Primitive element, index form
  35.  * @iprim:    prim-th root of 1, index form
  36.  * @gfpoly:    The primitive generator polynominal
  37.  * @gffunc:    Function to generate the field, if non-canonical representation
  38.  * @users:    Users of this structure
  39.  * @list:    List entry for the rs control list
  40. */
  41. struct rs_control {
  42.     int         mm;
  43.     int         nn;
  44.     uint16_t    *alpha_to;
  45.     uint16_t    *index_of;
  46.     uint16_t    *genpoly;
  47.     int         nroots;
  48.     int         fcr;
  49.     int         prim;
  50.     int         iprim;
  51.     int        gfpoly;
  52.     int        (*gffunc)(int);
  53.     int        users;
  54.     struct list_head list;
  55. };
  56.  
  57. /* General purpose RS codec, 8-bit data width, symbol width 1-15 bit  */
  58. #ifdef CONFIG_REED_SOLOMON_ENC8
  59. int encode_rs8(struct rs_control *rs, uint8_t *data, int len, uint16_t *par,
  60.            uint16_t invmsk);
  61. #endif
  62. #ifdef CONFIG_REED_SOLOMON_DEC8
  63. int decode_rs8(struct rs_control *rs, uint8_t *data, uint16_t *par, int len,
  64.         uint16_t *s, int no_eras, int *eras_pos, uint16_t invmsk,
  65.            uint16_t *corr);
  66. #endif
  67.  
  68. /* General purpose RS codec, 16-bit data width, symbol width 1-15 bit  */
  69. #ifdef CONFIG_REED_SOLOMON_ENC16
  70. int encode_rs16(struct rs_control *rs, uint16_t *data, int len, uint16_t *par,
  71.         uint16_t invmsk);
  72. #endif
  73. #ifdef CONFIG_REED_SOLOMON_DEC16
  74. int decode_rs16(struct rs_control *rs, uint16_t *data, uint16_t *par, int len,
  75.         uint16_t *s, int no_eras, int *eras_pos, uint16_t invmsk,
  76.         uint16_t *corr);
  77. #endif
  78.  
  79. /* Create or get a matching rs control structure */
  80. struct rs_control *init_rs(int symsize, int gfpoly, int fcr, int prim,
  81.                int nroots);
  82. struct rs_control *init_rs_non_canonical(int symsize, int (*func)(int),
  83.                                          int fcr, int prim, int nroots);
  84.  
  85. /* Release a rs control structure */
  86. void free_rs(struct rs_control *rs);
  87.  
  88. /** modulo replacement for galois field arithmetics
  89.  *
  90.  *  @rs:    the rs control structure
  91.  *  @x:        the value to reduce
  92.  *
  93.  *  where
  94.  *  rs->mm = number of bits per symbol
  95.  *  rs->nn = (2^rs->mm) - 1
  96.  *
  97.  *  Simple arithmetic modulo would return a wrong result for values
  98.  *  >= 3 * rs->nn
  99. */
  100. static inline int rs_modnn(struct rs_control *rs, int x)
  101. {
  102.     while (x >= rs->nn) {
  103.         x -= rs->nn;
  104.         x = (x >> rs->mm) + (x & rs->nn);
  105.     }
  106.     return x;
  107. }
  108.  
  109. #endif
  110.